generic
   type modele is private;
   with function Creer return modele is <>;
   with function Inscrire ( c : modele; i : Individu ) return modele is <>;
   with function Bloquer ( c : modele; i : Individu; j : Individu ) return modele is <>;
   with function Debloquer ( c : modele; i : Individu; j : Individu ) return modele is <>;
   with function Ajouter_cercle ( c : modele; i : Individu; u : Cercle ) return modele is <>;
   with function Retirer_cercle ( c : modele; i : Individu; u : Cercle ) return modele is <>;
   with function Ajouter_membre ( c : modele; u : Cercle; i : Individu; j : Individu ) return modele is <>;
   with function Retirer_membre ( c : modele; u : Cercle; i : Individu; j : Individu ) return modele is <>;
   with function Poster ( c : modele; i : Individu; u : Cercle; t : Texte ) return modele is <>;
   with function Commenter ( c : modele; i : Individu; n : Natural; t : Texte ) return modele is <>;
   with function Est_inscrit ( c : modele; i : Individu ) return Boolean is <>;
   with function Nombre_inscrits ( c : modele ) return Natural is <>;
   with function Ieme_inscrit ( c : modele; n : Natural ) return Individu is <>;
   with function Est_bloque ( c : modele; i : Individu; j : Individu ) return Boolean is <>;
   with function Est_cercle_de ( c : modele; i : Individu; u : Cercle) return Boolean is <>;
   with function Nombre_cercles ( c : modele; i : Individu ) return Natural is <>;
   with function Ieme_cercle ( c : modele; n : Natural; i : Individu ) return Cercle is <>;
   with function Est_membre_de ( c : modele; u : Cercle; i : Individu; j : Individu ) return Boolean is <>;
   with function Nombre_membres ( c : modele; i : Individu; u : Cercle) return Natural is <>;
   with function Ieme_membre ( c : modele; n : Natural; i : Individu; u : Cercle ) return Individu is <>;
   with function Nombre_posts ( c : modele ) return Natural is <>;
   with function Consulter ( c : modele; i : Individu ) return Mur is <>;
package Communautes.implementation is
   type communaute is new communautes.communaute with private;
   function Creer return Communaute;
   function Inscrire ( c : Communaute; i : Individu ) return Communaute;
   function Bloquer ( c : Communaute; i : Individu; j : Individu ) return Communaute;
   function Debloquer ( c : Communaute; i : Individu; j : Individu ) return Communaute;
   function Ajouter_cercle ( c : Communaute; i : Individu; u : Cercle ) return Communaute;
   function Retirer_cercle ( c : Communaute; i : Individu; u : Cercle ) return Communaute;
   function Ajouter_membre ( c : Communaute; u : Cercle; i : Individu; j : Individu ) return Communaute;
   function Retirer_membre ( c : Communaute; u : Cercle; i : Individu; j : Individu ) return Communaute ;
   function Poster ( c : Communaute; i : Individu; u : Cercle; t : Texte ) return Communaute;
   function Commenter ( c : Communaute; i : Individu; n : Natural; t : Texte ) return Communaute;
   function Est_inscrit ( c : Communaute; i : Individu ) return Boolean;
   function Nombre_inscrits ( c : Communaute ) return Natural;
   function Ieme_inscrit ( c : Communaute; n : Natural ) return Individu;
   function Est_bloque ( c : Communaute; i : Individu; j : Individu ) return Boolean;
   function Est_cercle_de ( c : Communaute; i : Individu; u : Cercle) return Boolean;
   function Nombre_cercles ( c : Communaute; i : Individu ) return Natural;
   function Ieme_cercle ( c : Communaute; n : Natural; i : Individu ) return Cercle;
   function Est_membre_de ( c : Communaute; u : Cercle; i : Individu; j : Individu ) return Boolean;
   function Nombre_membres ( c : Communaute; i : Individu; u : Cercle) return Natural;
   function Ieme_membre ( c : Communaute; n : Natural; i : Individu; u : Cercle ) return Individu;
   function Nombre_posts ( c : Communaute ) return Natural;
   function Consulter ( c : Communaute; i : Individu ) return Mur;
private
   type communaute is new Communautes.Communaute with record
      un_modele : modele;
   end record;
end Communautes.implementation;

